from zhipuai import ZhipuAI
import json
import requests
import re

client = ZhipuAI(api_key="e01b3f7ea25754c994ab325c5d096be6.U2t6lVQoH1DSl0n4")

# 定义API信息
api_info = {
    "获取法人代表": {'route': '/law_api/api', 'param': 'company_name'},
    "获取公司全部信息": {'route': '/law_api/get_company_info', 'param': 'company_name'},
    "根据公司注册信息某个字段是某个值来查询具体的公司名称": {'route': '/law_api/search_company_name_by_register', 'param': ['key', 'value']},
    "根据公司基本信息某个字段是某个值来查询具体的公司名称": {'route': '/law_api/search_company_name_by_info', 'param': ['key', 'value']},
    "根据公司名称获得该公司所有注册信息": {'route': '/law_api/get_company_register', 'param': 'company_name'},
    "根据子公司名称获得该公司所有关联子公司信息": {'route': '/law_api/get_sub_company_info', 'param': 'company_name'},
    "根据关联子公司信息某个字段是某个值来查询具体的公司名称": {'route': '/law_api/search_company_name_by_sub_info', 'param': ['key', 'value']},
    "根据案号获得该案所有基本信息": {'route': '/law_api/get_legal_document', 'param': 'case_num'},
}

# 定义问题列表
question_contents = ["浩云科技股份有限公司的邮政编码和注册地址分别是？"]

# # 获取json文件内容
file_path = "subcopy.json"
# 先往question_contents里面填问题内容
with open(file_path, 'r', encoding='utf-8') as file:
    data = json.load(file)

# 提取所有的question值
question_contents = [item['question'] for item in data]


def extract_data(text):
    # 正则表达式匹配JSON格式的数据或字符串"nu"
    pattern = r'\{[^{}]*\}|nu'
    match = re.search(pattern, text)
    
    if match:
        # 如果匹配成功，返回匹配的数据
        return match.group()
    else:
        # 如果没有匹配的数据，返回None
        return None
# 定义提取API和参数的函数
def get_api_and_params(question_content):
    # 使用模型API理解和处理问题
    messages = [
        {
            "role": "user",
            "content": f"前提：不要回复我要求之外的任何文字。我只要json格式的数据。我有八个基础api如下{api_info},请分析以下问题，并告诉我需要调用哪个API以及提取哪些参数，要求这些都要从原问题中获取,比如说原问题中出现注册号，你就需要在提取的参数一栏中写注册号，而不是写register_num除此之外，问题描述即为问题原文：{question_content},不要回复多余的东西！严格按照以下格式回复我：问题描述，问题需要调用api的路由，提取的参数，参数值。这些全部用json格式返回给我，并且请注意,不需要以markdown的形式写，并且不需要写```json和```；提取的参数不要有方括号也不要有引号，参数值也一样。请严格遵守。如果遇到这样的问题：请查询景津装备股份有限公司所属的行业类别，并告知在该行业分类下共有多少家公司？需要组合使用api的复杂问题就统一返回字符串nu，除了这个nu之外其他什么都不要说。如果有两个json，请把他们不相同的部分合并用逗号隔开再回复。"
        }
    ]
    response = client.chat.completions.create(
        model="glm-4",  # 填写需要调用的模型名称
        messages=messages,
        tool_choice="auto",
    )
    reply = response.choices[0].message.content
    # print("------")
    # print(reply)
    print("------")
    clean_reply = extract_data(reply)
    print(clean_reply)
    print("------")
    if(clean_reply==None):
        return None
    # 将JSON字符串解析为字典
    reply_json = json.loads(clean_reply)

    # 提取四个字段
    if(clean_reply!="nu"):
        question_description = reply_json["问题描述"]
        api_route = reply_json["问题需要调用api的路由"]
        extracted_parameter = reply_json["提取的参数"]
        parameter_value = reply_json["参数值"]
        # 打印提取的字段
        # print(f"问题描述: {question_description}")
        # print(f"API路由: {api_route}")
        # print(f"提取的参数: {extracted_parameter}")
        # print(f"参数值: {parameter_value}")

        return question_description,api_route,extracted_parameter,parameter_value
    else:
        return None

def writefile(answer,question_de):
    # 假设您的 JSON 文件名为 data.json
    filename = 'subcopy.json'

    # 读取 JSON 文件
    with open(filename, 'r', encoding='utf-8') as file:
        data = json.load(file)

    # 更新答案
    updated_any = False
    
    updated = False
    for item in data:
        if item['question'] == question_de:
            # 找到匹配的问题，更新答案
            item['answer'] = answer
            updated = True
            updated_any = True
            break  # 匹配成功，跳出内层循环
    if not updated:
        print(f"没有找到与 '{question_de}' 匹配的问题。")

    # 如果有任何更新，将更新后的数据写回 JSON 文件
    if updated_any:
        with open(filename, 'w', encoding='utf-8') as file:
            json.dump(data, file, ensure_ascii=False, indent=4)

    print("答案已更新到 JSON 文件。" if updated_any else "没有问题匹配，JSON 文件未更新。")

# 测试函数
for qc in question_contents:
    try:
        qd, ar, ep, pv = get_api_and_params(qc)
        
    except Exception as e:
        # 在这里处理错误
        print(f"发生错误：{e}")
        # 可以设置一些默认值或进行其他错误处理
        qd, ar, ep, pv = None, None, None, None
        continue
    if ar is None and ar == "nu":
        continue
    # print("------")
    
    domain = "comm.chatglm.cn"

    # 检查列表长度是否为2
    if len(ar) == 2:
        continue

        
    url = f"https://{domain}{ar}"
    print("url为"+url)
    data = {
            f"{ep}": f"{pv}"
        }
    # print(f"data为{data}")
    headers = {
        'Content-Type': 'application/json',
        'Authorization': 'Bearer DE32EB46D23350E0B75B3702C8D5DC036F8CE32DC73C919D'
    }
    
    try:
        # 假设这是您的代码，可能会引发错误
        parameters = ep.split(',')
        parameter_values = pv.split(',')
        # ... 这里可以继续处理参数和参数值 ...
        print(parameter_values)
    except Exception as e:
        # 这里的Exception可以捕获几乎所有的错误
        # e变量将包含错误信息
        print(f"发生错误：{e}")
        # ... 这里可以处理错误，例如设置参数和参数值为空列表或任何其他合理的默认值 ...
        parameters = []
        parameter_values = []
        
    
    # 确保 parameters 和 parameter_values 的长度相同
    if len(parameters) == len(parameter_values):
        # 创建一个字典来存储参数和值
        data = {f"{ep}": f"{pv}" for ep, pv in zip(parameters, parameter_values)}
    else:
        print("参数和参数值的数量不匹配，请检查输入数据。")
    rsp = requests.post(url, json=data, headers=headers)
    # print(rsp.json())

# -------------------------------------------------------------------------
    # 如果模型回复model_reply为空，那么将url即103行的ar修改为/law_api/get_company_register
    if rsp.json() == []:
        url = f"https://comm.chatglm.cn/law_api/get_company_register"

        data = {
                f"{ep}": f"{pv}"
            }

        headers = {
            'Content-Type': 'application/json',
            'Authorization': 'Bearer DE32EB46D23350E0B75B3702C8D5DC036F8CE32DC73C919D'
        }
        
        # 提取参数和参数值
        parameters = ep.split(',')
        parameter_values = pv.split(',')
        
        # 确保 parameters 和 parameter_values 的长度相同
        if len(parameters) == len(parameter_values):
            # 创建一个字典来存储参数和值
            data = {f"{ep}": f"{pv}" for ep, pv in zip(parameters, parameter_values)}
        else:
            print("参数和参数值的数量不匹配，请检查输入数据。")
        rsp = requests.post(url, json=data, headers=headers)
        # print(rsp.json())

        # 构造消息，将问题和答案作为上下文传递给模型
        messages = [
            {
                "role": "user",
                "content": f"这个是问题{qd}，而这个是可能包含问题答案的信息{rsp.json()}，请在信息中找寻总结答案并重新组织一下语言，然后回复给我，除了我要求的回复内容外，其他的话都不要说，如果答案为空，那就由你去联网搜索答案回复给我，如果联网搜索也找不到答案就直接回复该问题没有答案。"
            }
        ]
        # 使用模型生成回答
        response = client.chat.completions.create(
            model="glm-4",  # 填写需要调用的模型名称
            messages=messages,
            tool_choice="auto"
        )
        # fin_model_reply为模型回复的最总答案
        fin_model_reply = response.choices[0].message.content
        print("***************")
        print(f"原始数据为：{rsp.json()}")
        print(fin_model_reply)
        print("***************")
        writefile(fin_model_reply,qd)
    else:
        url = f"https://comm.chatglm.cn{ar}"
        print(f"ar为：{ar},url为："+url)
        data = {
                f"{ep}": f"{pv}"
            }
        print(data)
        headers = {
            'Content-Type': 'application/json',
            'Authorization': 'Bearer DE32EB46D23350E0B75B3702C8D5DC036F8CE32DC73C919D'
        }
        
        try:
            # 假设这是您的代码，可能会引发错误
            parameters = ep.split(',')
            parameter_values = pv.split(',')
            # ... 这里可以继续处理参数和参数值 ...
            print(parameter_values)
        except Exception as e:
            # 这里的Exception可以捕获几乎所有的错误
            # e变量将包含错误信息
            print(f"发生错误：{e}")
            # ... 这里可以处理错误，例如设置参数和参数值为空列表或任何其他合理的默认值 ...
            parameters = []
            parameter_values = []
        
        # 确保 parameters 和 parameter_values 的长度相同
        if len(parameters) == len(parameter_values):
            # 创建一个字典来存储参数和值
            data = {f"{ep}": f"{pv}" for ep, pv in zip(parameters, parameter_values)}
        else:
            print("参数和参数值的数量不匹配，请检查输入数据。")

        rsp = requests.post(url, json=data, headers=headers)
        print(rsp.json())

        # 构造消息，将问题和答案作为上下文传递给模型
        messages = [
            {
                "role": "user",
                "content": f"这个是问题{qd}，而这个是可能包含问题答案的信息{rsp.json()}，请在信息中找寻总结答案并重新组织一下语言，然后回复给我，除了我要求的回复内容外，其他的话都不要说，如果这道题没有答案，那就回复：这个问题没有答案。"
            }
        ]
        # 使用模型生成回答
        response = client.chat.completions.create(
            model="glm-4",  # 填写需要调用的模型名称
            messages=messages,
            tool_choice="auto"
        )
        # 获取模型的回答
        fin_model_reply = response.choices[0].message.content
        print("***************")
        print(fin_model_reply)
        print("***************")
        writefile(fin_model_reply,qd)
